home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
dir
/
dum2
/
src
/
dumisc.mod
< prev
next >
Wrap
Text File
|
1987-05-28
|
9KB
|
331 lines
IMPLEMENTATION MODULE DuMisc;
(*$S-*)(*$T-*)(*$A+*)
(*
This module has several miscellaneous procedures
and was separated to keep the main program from getting
more cluttered than it was. Someday I'll clean it all up.
Written: 3/21/87 by Greg Browne
Compiles on TDI's Modula-2 Compiler version 2.20a
*)
FROM SYSTEM IMPORT ADR, NULL,ADDRESS,TSIZE;
FROM Ports IMPORT ReplyMsg,GetMsg,MessagePtr;
FROM DOSCodeLoader IMPORT Execute;
FROM DOSFiles IMPORT Lock,Unlock,AccessRead,FileLock,Open, Close,
Read, Write, DeleteFile, Examine,Rename,
FileInfoBlock, IoErr, FileHandle,
AccessWrite,ModeNewFile, ModeOldFile;
FROM DuTypefile IMPORT DisplayASCII,DisplayHex;
FROM Conversions IMPORT ConvertToString;
FROM Gadgets IMPORT RefreshGadgets,AddGadget,RemoveGadget;
FROM Strings IMPORT Assign,Concat,Length,Insert;
FROM Memory IMPORT AllocMem,FreeMem,MemReqSet,MemClear,MemPublic;
FROM Intuition IMPORT IntuitionText;
FROM DuWindow IMPORT GadgetNames,DuWindowPtr,DuGads,SlidePot,
IOStringInfo,IOString,NullReqPtr;
FROM DuDir IMPORT DirEntries,DirTable,QSort;
(* All defined in .def module to be exportable
TYPE
CharPtr = POINTER TO CHAR;
VAR
MyMsg : IntuiMessagePtr;
MyClass : IDCMPFlagSet;
MyGadPtr : GadgetPtr;
OutHandle : FileHandle;
GadGot : GadgetNames;
MyX,MyY : INTEGER;
Gp : ARRAY[0..255] OF CHAR;
*)
TYPE
FileInfoBlockPtr = POINTER TO FileInfoBlock;
VAR
Cp : CharPtr;
(* ================================*)
PROCEDURE CheckMessages():BOOLEAN;
BEGIN
MyMsg := GetMsg(DuWindowPtr^.UserPort);
IF MyMsg = NULL THEN RETURN FALSE END;
MyClass := MyMsg^.Class;
MyX := MyMsg^.MouseX;
MyY := MyMsg^.MouseY;
MyGadPtr := MyMsg^.IAddress;
ReplyMsg(MessagePtr(MyMsg));
GadGot := GadgetNames(MyGadPtr^.GadgetID);
RETURN TRUE;
END CheckMessages;
PROCEDURE FillGpto(VAR a,b:ARRAY OF CHAR);
BEGIN
Insert(" to ",Gp,0);
Insert(b,Gp,0);
Insert(a,Gp,0);
ReplaceRSDM(msg,Gp);
END FillGpto;
PROCEDURE AddNameToPath(VAR name,path:ARRAY OF CHAR);
(* Second name is a path with no filename, first is filename to add *)
BEGIN
Assign(Gp,path);
IF (Gp[Length(path)-1] <> ":") THEN Concat(Gp,"/",Gp) END;
Concat(Gp,name,Gp);
END AddNameToPath;
PROCEDURE DoFileLook():BOOLEAN;
VAR s: BOOLEAN; i:CARDINAL ;g:GadgetNames;
l: FileLock;
BEGIN
g := GadGot;
FOR i := 1 TO DirEntries DO
IF CheckMessages() THEN RETURN TRUE END;
WITH DirTable[i]^ DO
IF (IsSelected) AND (NOT IsDir) THEN
s := FALSE;
IF (g = htype) OR (g = type) THEN s := TRUE END;
l := Lock(FileName,AccessRead);
IF (l <> 0) THEN
Unlock(l);
IF (g = type) OR (g = print) THEN
DisplayASCII(FileName,s)
ELSE
DisplayHex(FileName,s)
END;
WasSelected := TRUE;
IsSelected := FALSE;
END
END
END
END;
RETURN FALSE;
END DoFileLook;
PROCEDURE DuCopy(VAR from,into:ARRAY OF CHAR):LONGINT;
VAR fhand,tohand:FileHandle;siz:CARDINAL;er,ex:LONGINT;
ad:ADDRESS;
BEGIN
ex := LONGINT(0);
siz := 4000H;
AddNameToPath(from,into);
fhand := Open(from,ModeOldFile);
IF fhand = 0 THEN RETURN IoErr() END;
tohand := Open(Gp,ModeNewFile);
IF tohand = 0 THEN
er := IoErr();
Close(fhand);
RETURN er;
END;
REPEAT
ad := AllocMem(LONGCARD(siz),MemReqSet{MemPublic,MemClear});
IF ad = NULL THEN siz := siz DIV 2 END;
UNTIL (ad # NULL) OR (siz < 512);
IF ad = NULL THEN
Close(fhand);
Close(tohand);
RETURN LONGINT(-3)
END;
FillGpto("Copying ",from);
REPEAT
er := Read(fhand,ad,LONGCARD(siz));
IF er > 0 THEN er := Write(tohand,ad,LONGCARD(er)) ELSE ex := IoErr() END;
UNTIL (er <> LONGINT(siz));
Close(fhand);
Close(tohand);
FreeMem(ad,LONGCARD(siz));
RETURN ex;
END DuCopy;
PROCEDURE CheckDestination():BOOLEAN;
(* checks to see that IOString[dest] is a valid path without name *)
VAR l : FileLock; IsOrNot:BOOLEAN; m:FileInfoBlockPtr;
BEGIN
IsOrNot := FALSE; (* Assume not ok *)
l := Lock(IOString[dest],AccessRead);
IF l = 0 THEN RETURN IsOrNot END;
m := AllocMem(TSIZE(FileInfoBlock),MemReqSet{MemPublic,MemClear});
IF (m # NULL) THEN
IF Examine(l,m^) AND (m^.fibDirEntryType > 0) THEN IsOrNot := TRUE END;
END;
Unlock(l);
FreeMem(m,TSIZE(FileInfoBlock));
RETURN IsOrNot;
END CheckDestination;
PROCEDURE BlankName(VAR name:ARRAY OF CHAR);
BEGIN
name[0] := 177C;
name[1] := 177C;
name[2] := 0C;
END BlankName;
PROCEDURE DuMoveFile(VAR name,name2:ARRAY OF CHAR):LONGINT;
(* Returns IoErr or 0 *)
BEGIN
IF Rename(name,name2) THEN
BlankName(name);
RETURN LONGINT(0)
END;
RETURN IoErr();
END DuMoveFile;
PROCEDURE DuDelete(VAR name:ARRAY OF CHAR):LONGINT;
(* Returns IoErr or 0 *)
BEGIN
Assign(Gp,"Deleting ");
Concat(Gp,name,Gp);
ReplaceRSDM(msg,Gp);
IF DeleteFile(name) THEN
BlankName(name);
RETURN LONGINT(0);
END;
RETURN IoErr();
END DuDelete;
PROCEDURE DuFileTwiddle(WithCopy,WithDelete:BOOLEAN):LONGINT;
(* Returns IoErr *)
VAR i:CARDINAL ;g:GadgetNames;
from,to: FileLock;er:LONGINT;temp:ARRAY[0..30] OF CHAR;
BEGIN
g := GadGot;
IF (NOT CheckDestination()) AND WithCopy THEN RETURN LONGINT(-1) END;
FOR i := 1 TO DirEntries DO
IF CheckMessages() THEN RETURN LONGINT(-2) END;
WITH DirTable[i]^ DO
IF (IsSelected) AND (NOT IsDir) THEN
from := Lock(FileName,AccessRead);
IF (from <> 0) THEN
Unlock(from);
IF (NOT WithCopy) AND (NOT WithDelete) THEN
Assign(temp,FileName);
AddNameToPath(FileName,IOString[dest]);
er := DuMoveFile(FileName,Gp);
IF (er <> 0) THEN RETURN er
ELSE FillGpto("Moved ",temp);
END;
END;
IF WithCopy THEN
er := (DuCopy(FileName,IOString[dest]));
IF (er <> 0) THEN RETURN er END;
END;
IF WithDelete THEN
er := DuDelete(FileName);
IF (er <> 0) THEN RETURN er END;
ELSE
WasSelected := TRUE;
IsSelected := FALSE;
END
END
END
END
END;
RETURN LONGINT(0);
END DuFileTwiddle;
PROCEDURE DoIt(WRun:BOOLEAN;VAR a,b,c,d:ARRAY OF CHAR);
BEGIN
IF WRun THEN Assign(Gp,"RUN >NIL: ") ELSE Gp := "" END;
Concat(Gp,a,Gp);
Concat(Gp," ",Gp);
Concat(Gp,b,Gp);
Concat(Gp," ",Gp);
Concat(Gp,c,Gp);
IF (d[0] > 0C) THEN
Concat(Gp,' "',Gp);
Concat(Gp,d,Gp);
Concat(Gp,'"',Gp);
END;
IF Execute(Gp,FileHandle(0),OutHandle) THEN END;
END DoIt;
PROCEDURE TryIt(g:GadgetNames;VAR Name:ARRAY OF CHAR);
BEGIN
CASE g OF
arc : DoIt(FALSE,"ARC ",IOString[run],IOString[dest],Name);|
edit : DoIt(FALSE,"MEmacs ","","",Name); |
runfr : DoIt(TRUE, Name,"","",IOString[run]); |
runrf : DoIt(TRUE, IOString[run],"","",Name); |
show : DoIt(FALSE,"SHOW ","","",Name); |
execfr: DoIt(FALSE, Name,IOString[run],"",""); |
execrf: DoIt(FALSE, IOString[run],Name,"","");
ELSE
END;
END TryIt;
PROCEDURE DuExec():LONGINT;
VAR s: BOOLEAN; i:CARDINAL ;g:GadgetNames;
l: FileLock;
BEGIN
g := GadGot; s:= FALSE;
FOR i := 1 TO DirEntries DO
IF CheckMessages() THEN RETURN LONGINT(-2) END;
WITH DirTable[i]^ DO
IF (IsSelected) THEN
IF (NOT IsDir) OR (g = execrf) THEN
s := TRUE;
TryIt(g,FileName);
IsSelected := FALSE;
WasSelected := TRUE;
END;
END;
END;
END;
IF (s = FALSE) THEN
IF (g = execfr) OR (g=execrf) THEN
TryIt(g,"")
ELSIF (g <> show) THEN
TryIt(g,"");
END;
END;
RETURN LONGINT(0);
END DuExec;
PROCEDURE ReplaceRSDM(g:GadgetNames;VAR a:ARRAY OF CHAR);
VAR VAR d:INTEGER;
BEGIN
d := RemoveGadget(DuWindowPtr,DuGads[g]);
Assign(IOString[g],a);
IF g = msg THEN Insert(" ",IOString[g],0) END;
IOStringInfo[g].NumChars := Length(IOString[g]);
IOStringInfo[g].BufferPos := Length(IOString[g]);
d := AddGadget(DuWindowPtr,DuGads[g],d);
RefreshGadgets(DuGads[g],DuWindowPtr,NullReqPtr^);
END ReplaceRSDM;
PROCEDURE StringIt(n:LONGCARD;VAR s:ARRAY OF CHAR):BOOLEAN;
VAR Okay:BOOLEAN;
BEGIN
ConvertToString(ABS(n),10,FALSE,s,Okay);
RETURN Okay
END StringIt;
PROCEDURE AskForConfirm;
BEGIN
ReplaceRSDM(msg,"Click same GADGET again to DO IT! (Anything else cancels)");
END AskForConfirm;
(********)
(* MAIN *)
(********)
BEGIN
END DuMisc.